package com.unlp.javaclickers.alumno.vistas;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Window;

import javax.swing.AbstractButton;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.List;

import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.JButton;

import org.apache.log4j.Logger;
import com.unlp.javaclickers.docente.dto.DTORespuesta;

public class ResponderPreguntaAlumno {

	private JFrame frmResponderPreguntar;
	private JFrame mainAlumno;
	private final ButtonGroup respuestas = new ButtonGroup();
	private int tiempo;
	private String pregunta;
	protected DTORespuesta elegida;
	private List<DTORespuesta> respuestasPosibles;
	private com.unlp.javaclickers.alumno.vistas.SingletonParameters param;
	protected JRadioButton seleccion;
	private JLabel labelTiempo;
	private JLabel labelPregunta;
	private JPanel panelRespuestas;
	private JScrollPane panelScroll;
	private Thread hilo;
	private Contador contador;
	private JButton btnEnviar;
	private JPanel panelBotonEnviar;
	private JLabel lblEsperando;

	private Runnable conectarseProfesor = new Runnable() {

		@Override
		public void run() {
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					lblEsperando.setText("Por favor espere...");
					btnEnviar.setEnabled(false);
				}
			});
			contador.cancelarTimer();
			hilo.interrupt();
			if (respuestas.getSelection() != null) {
				Enumeration<AbstractButton> allRadioButton = respuestas
						.getElements();
				while (allRadioButton.hasMoreElements()) {
					JRadioButton temp = (JRadioButton) allRadioButton
							.nextElement();
					if (temp.isSelected()) {
						seleccion = temp; // obtengo el radio button
											// seleccionado
						LOGGER.info("Respuesta elegida " + seleccion.getText());
					}
				}
				for (DTORespuesta r : respuestasPosibles) { // no
															// me
															// gusta
															// mucho
															// esto
					if (r.getDescripcion().equals(
							seleccion.getText().toString())) {
						elegida = r;
						break;
					}
				}
				enviarSeleccion();
			}
		}

	};

	private static Logger LOGGER = Logger
			.getLogger(ResponderPreguntaAlumno.class);

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ResponderPreguntaAlumno window = new ResponderPreguntaAlumno();
					window.frmResponderPreguntar.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public ResponderPreguntaAlumno(JFrame mainAl, int t, String preg,
			List<DTORespuesta> respuestasP) {
		mainAlumno = mainAl;
		tiempo = t;
		pregunta = preg;
		respuestasPosibles = respuestasP;
		initialize();
	}

	public ResponderPreguntaAlumno() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmResponderPreguntar = new JFrame();
		frmResponderPreguntar.setTitle("Responder Pregunta - JavaClickers");
		frmResponderPreguntar.setBounds(100, 100, 620, 474);
		// frmResponderPreguntar.setResizable(false);
		frmResponderPreguntar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmResponderPreguntar.getContentPane().setLayout(
				new BoxLayout(frmResponderPreguntar.getContentPane(),
						BoxLayout.Y_AXIS));

		JPanel panel = new JPanel();
		panel.setBackground(Color.WHITE);
		frmResponderPreguntar.getContentPane().add(panel);

		JLabel labelImagen = new JLabel("");
		panel.add(labelImagen);
		labelImagen.setIcon(new ImageIcon(getClass().getResource("logo.PNG")));

		JPanel panelTiempo = new JPanel();
		panelTiempo.setBackground(Color.WHITE);
		frmResponderPreguntar.getContentPane().add(panelTiempo);
		labelTiempo = new JLabel("Segundos restantes: " + tiempo);
		labelTiempo.setFont(new Font("Teen", Font.BOLD, 16));
		panelTiempo.add(labelTiempo);

		JPanel panelPregunta = new JPanel();
		panelPregunta.setBackground(Color.WHITE);
		frmResponderPreguntar.getContentPane().add(panelPregunta);
		labelPregunta = new JLabel("\n Pregunta: " + pregunta);
		labelPregunta.setFont(new Font("Teen", Font.BOLD, 16));
		panelPregunta.add(labelPregunta);

		param = SingletonParameters.getSingletonParameters();
		param.getParametros().setResponderPreguntaAlumno(this);

		panelRespuestas = new JPanel();
		panelRespuestas.setBackground(Color.WHITE);
		panelRespuestas.setLayout(new GridLayout(respuestasPosibles.size(), 1));

		JRadioButton button;
		for (DTORespuesta res : respuestasPosibles) {
			button = new JRadioButton();
			button.setText(res.getDescripcion());
			button.setAutoscrolls(true);
			respuestas.add(button);
			panelRespuestas.add(button);
			elegida = res;
		}
		panelScroll = new JScrollPane(panelRespuestas);
		frmResponderPreguntar.getContentPane().add(panelScroll);

		JPanel panelEsperando = new JPanel();
		panelEsperando.setBackground(Color.WHITE);
		frmResponderPreguntar.getContentPane().add(panelEsperando);

		lblEsperando = new JLabel();
		panelEsperando.add(lblEsperando);
		lblEsperando.setFont(new Font("Teen", Font.BOLD, 16));

		panelBotonEnviar = new JPanel();
		panelBotonEnviar.setBackground(Color.WHITE);
		frmResponderPreguntar.getContentPane().add(panelBotonEnviar);

		btnEnviar = new JButton("Enviar seleccion");
		btnEnviar.setFont(new Font("Teen", Font.BOLD, 16));
		btnEnviar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				new Thread(conectarseProfesor).start();
			}
		});
		panelBotonEnviar.add(btnEnviar);
		contador = new Contador();
		hilo = new Thread(contador);
		hilo.start();

	}

	@SuppressWarnings("unchecked")
	public synchronized void enviarSeleccion() {
		try {
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					lblEsperando.setText("Por favor espere...");
					btnEnviar.setEnabled(false);
				}
			});
			param.getParametros().getOos().writeObject(elegida);
			contador.cancelarTimer();
			hilo.interrupt();
			LOGGER.info("Respuesta elegida " + elegida.getDescripcion()
					+ " enviadaa");
			String informacion = param.getParametros().getOis().readUTF();
			if (informacion.equals("contestar")) {
				// iniciar timer
				tiempo = param.getParametros().getOis().readInt();
				param.getParametros().setTiempo(tiempo);
				pregunta = param.getParametros().getOis().readUTF();
				// se debe recibir primero el problema
				Object aux = param.getParametros().getOis().readObject();
				if (aux instanceof List<?>) {
					respuestasPosibles = (List<DTORespuesta>) aux;
				} else {
					System.out.println("ERRROOOOR no es una collection");
				}
				LOGGER.info("Se recibio info siguiente problema");
				this.actualizarVista();
				LOGGER.info("se actualizo vista");
			} else {
				param.closeParameters();
				JOptionPane.showMessageDialog(this.getFrame(),
						"Ya completo la clase");
				this.getFrame().setVisible(false);
				this.mainAlumno.setVisible(true);
			}
		} catch (SocketTimeoutException s) {
			LOGGER.error("Socket timed out!", s);
			JOptionPane
					.showMessageDialog(
							this.getFrame(),
							"TimeOut, error en la conexion, espere que termine la clase y avisele al profesor");
			this.getFrame().setVisible(false);
			this.mainAlumno.setVisible(true);
		} catch (UnknownHostException e) {
			JOptionPane
					.showMessageDialog(this.getFrame(),
							"La direccion del profesor es incorrecta, intentelo de nuevo");
			this.getFrame().setVisible(false);
			this.mainAlumno.setVisible(true);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(this.getFrame(),
					"Ocurrio un error en la conexion");
			this.getFrame().setVisible(false);
			this.mainAlumno.setVisible(true);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			this.getFrame().setVisible(false);
			this.mainAlumno.setVisible(true);
		}

	}

	public void actualizarVista() {
		labelTiempo.setText("Segundos restantes: " + tiempo);
		labelPregunta.setText("\n Pregunta: " + pregunta);
		lblEsperando.setText("");
		frmResponderPreguntar.getContentPane().remove(panelBotonEnviar);
		frmResponderPreguntar.getContentPane().remove(panelScroll);
		panelRespuestas = new JPanel();
		panelRespuestas.setBackground(Color.WHITE);
		panelRespuestas.setLayout(new GridLayout(respuestasPosibles.size(), 1));

		JRadioButton button;
		for (DTORespuesta res : respuestasPosibles) {
			button = new JRadioButton();
			button.setText(res.getDescripcion());
			button.setAutoscrolls(true);
			respuestas.add(button);
			panelRespuestas.add(button);
			elegida = res;
		}
		panelScroll = new JScrollPane(panelRespuestas);
		frmResponderPreguntar.getContentPane().add(panelScroll);
		frmResponderPreguntar.getContentPane().add(panelBotonEnviar);
		btnEnviar.setEnabled(true);
	//	SwingUtilities.updateComponentTreeUI(frmResponderPreguntar);
		hilo = new Thread(contador);
		hilo.start();
	}

	public Window getFrame() {
		// TODO Auto-generated method stub
		return frmResponderPreguntar;
	}

	public void actualizarTimer() {
		labelTiempo.setText("Segundos restantes: " + tiempo);
		// SwingUtilities.updateComponentTreeUI(frmResponderPreguntar);
		tiempo--;
		return;
	}
}
